package fag.core.game;

import java.awt.geom.AffineTransform;

import fag.core.geometry.Vector2D;

/**
 * Interface des objets transformables.
 * @author lumz
 */
public interface Transformable {

	/**
	 * Référenciel de transformation.
	 * @author lumz
	 */
	public static enum Referential {
		ABSOLUTE,
		RELATIVE
	}
	
	/**
	 * Obtenir une instance de transformation.
	 * @return Une instance de transformation.
	 */
	public AffineTransform getTransformation();
	
	/**
	 * Obtenir le vecteur de translation de la matrice de transformation.
	 * @return Le vecteur de translation de la matrice de transformation.
	 */
	public Vector2D getTranslation();
	
	/**
	 * Obtenir la composante x de translation de la matrice de transformation.
	 * @return La composante x de translation de la matrice de transformation.
	 */
	public double getTranslationX();
	
	/**
	 * Obtenir la composante y de translation de la matrice de transformation.
	 * @return La composante y de translation de la matrice de transformation.
	 */
	public double getTranslationY();
	
	/**
	 * Obtenir la rotation de la matrice de transformation.
	 * @return La rotation de la matrice de transformation.
	 */
	public double getRotation();
	
	/**
	 * Effectuer une rotation autour de l'origine.
	 * @param angle L'angle de la rotation.
	 * @param referential Le référentiel utilisé pour la rotation.
	 */
	public void rotate(double angle, Referential referential);
	
	/**
	 * Effectuer une rotation autour d'un point.
	 * @param angle L'angle de la rotation.
	 * @param anchor L'axe de rotation.
	 * @param referential Le référentiel utilisé pour la rotation.
	 */
	public void rotate(double angle, Vector2D anchor, Referential referential);
	
	/**
	 * Effectuer une rotation autour d'un point.
	 * @param angle L'angle de la rotation.
	 * @param x La composante x de l'axe de rotation.
	 * @param y La composante y de l'axe de rotation.
	 * @param referential Le référentiel utilisé pour la rotation.
	 */
	public void rotate(double angle, double x, double y, Referential referential);
	
	/**
	 * Effectuer une mise à l'échelle.
	 * @param sx Le facteur x de mise à l'échelle.
	 * @param sy Le facteur y de mise à l'échelle.
	 * @param referential Le référentiel utilisé.
	 */
	public void scale(double sx, double sy, Referential referential);
	
	/**
	 * Effectuer une mise à l'échelle autour d'un axe.
	 * @param sx Le facteur x de mise à l'échelle.
	 * @param sy Le facteur y de mise à l'échelle.
	 * @param anchor L'axe utilisé pour la mise à l'échelle.
	 * @param referential Le référentiel utilisé pour la mise à l'échelle.
	 */
	public void scale(double sx, double sy, Vector2D anchor, Referential referential);
	
	/**
	 * Effectuer une mise à l'échelle autour d'un axe.
	 * @param sx Le facteur x de mise à l'échelle.
	 * @param sy Le facteur y de mise à l'échelle.
	 * @param ax La composante x de l'axe.
	 * @param ay La composante y de l'axe.
	 * @param referential Le référentiel utilisé pour la mise à l'échelle.
	 */
	public void scale(double sx, double sy, double ax, double ay, Referential referential);
	
	/**
	 * Fixer la rotation de la matrice de transformation.
	 * @param angle L'angle de la rotation.
	 */
	public void setRotation(double angle);
	
	/**
	 * Fixer une nouvelle transformation.
	 * @param transformation La nouvelle transformation.
	 */
	public void setTransformation(AffineTransform transformation);
	
	/**
	 * Fixer la translation de la matrice de transformation.
	 * @param translation La nouvelle translation de la matrice de transformation.
	 */
	public void setTranslation(Vector2D translation);
	
	/**
	 * Fixer la translation de la matrice de transformation.
	 * @param x La composante x de la matrice de transformation.
	 * @param y La composante y de la matrice de transformation.
	 */
	public void setTranslation(double x, double y);
	
	/**
	 * Réaliser une translation.
	 * @param translation La translation.
	 * @param referential Le référentiel utilisé.
	 */
	public void translate(Vector2D translation, Referential referential);
	
	/**
	 * Réaliser une translation.
	 * @param x La composante x de la translation.
	 * @param y La composante y de la translation.
	 * @param referential Le référentiel utilisé.
	 */
	public void translate(double x, double y, Referential referential);
}
